package secondary

/**
 * Definition for a Node.
 * type Node struct {
 *     Val int
 *     Next *Node
 *     Random *Node
 * }
 */
type Node1 struct {
	Val    int
	Next   *Node1
	Random *Node1
}

/*
	请实现 copyRandomList 函数，复制一个复杂链表。在复杂链表中，每个节点除了有一个 next 指针指向下一个节点，还有一个 random 指针指向链表中的任意节点或者 null。
	示例 1：
	输入：head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
	输出：[[7,null],[13,0],[11,4],[10,2],[1,0]]

	示例 2：
	输入：head = [[1,1],[2,1]]
	输出：[[1,1],[2,1]]

	示例 3：
	输入：head = [[3,null],[3,0],[3,null]]
	输出：[[3,null],[3,0],[3,null]]
	示例 4：

	输入：head = []
	输出：[]
	解释：给定的链表为空（空指针），因此返回 null。

	提示：

	-10000 <= Node.val <= 10000
	Node.random为空（null）或指向链表中的节点。
	节点数目不超过 1000 。


	来源：力扣（LeetCode）
	链接：https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof
	著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/
/*
	1. 将每个节点的拷贝独立到一个map中
	2. 遍历原链表、构建每个原链表节点映射节点的Next引用和Random引用
*/

func copyRandomList(head *Node1) *Node1 {
	m := make(map[*Node1]*Node1)
	cur := head
	for nil != cur {
		m[cur] = &Node1{Val: cur.Val}
		cur = cur.Next
	}
	cur = head
	for nil != cur {
		m[cur].Next = m[cur.Next]
		m[cur].Random = m[cur.Random]
		cur = cur.Next
	}
	return m[head]
}
